package com.dvj.demo.rabbitmq;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * Consumer
 * 消费者
 *
 * @author Dvj
 * @date 2021/6/30 18:30
 */
public class SimpleConsumer {
    public static void main(String[] args) throws TimeoutException, IOException {
        // 1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();

        // 2.设置参数
        // ip 默认值localhost
        factory.setHost("localhost");
        // 端口 默认值5672
        factory.setPort(5672);
        // 虚拟机 默认值/
        factory.setVirtualHost("/dvj");
        // 用户名 默认值 guest
        factory.setUsername("dvj");
        // 密码 默认值 guest
        factory.setPassword("dvj");

        // 3.创建连接 Connection
        Connection connection = factory.newConnection();

        // 4.创建Channel
        Channel channel = connection.createChannel();

        // 5.创建队列Queue
        /*
        queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
        参数：
             1.queue：队列名称
             2.durable：是否持久化
             3.exclusive：
                 * 是否独占，只能有一个消费者监听该队列
                 * 当Connection关闭时，是否删除该队列
             4.autoDelete：是否自动删除，当没有Consumer时，自动删除
             5.arguments：参数
         */
        // 如果没有一个名字的队列则创建该队列，否则不创建
        channel.queueDeclare("hello_world", true, false, false, null);

        // 6.接收消息
        /*
        basicConsume(String queue, boolean autoAck, Consumer callback)
        参数：
            1.queue：队列名称
            2.autoAck：是否自动确认
            3.callback：回调对象
         */

        Consumer consumer = new DefaultConsumer(channel) {
            /*
                回调方法，当收到消息后，会自动执行该方法
                1.consumerTag：标识
                2.envelope：获取一些信息，交换机，路由key。。。
                3.properties：配置信息
                4.body：数据
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) {
                System.out.println("consumerTag: " + consumerTag);
                System.out.println("envelope: " + envelope);
                System.out.println("properties: " + properties);
                System.out.println("body: " + new String(body));
            }
        };
        channel.basicConsume("hello_world", true, consumer);
    }
}
